昨天講完Migration,今天要講的Model也是跟資料庫息息相關。Model其實從剛開始講Laravel就一直提到,那Model到底是什麼呢?
基本上可以把Model想像成一個Laravel來跟資料表溝通的一種模式,每一張資料表都會有一個自己的model
我們可以透過操作model的方式來完成CRUD。
當然,Model 做為一個有利於我們開發的小幫手,它也有一些特別的小特性來讓我們 "少作一些事情"
這裡依照官方文件記錄一些特性:
1. 如果我們在model之中沒有去指定$table
的特別名稱,則預設為:類別名稱的小寫複數來當作映射的資料表名稱。
2. Model會預設每張資料表都有一個id欄位,並將其當作主鍵,當然也可以自行指定主鍵;另外預設主鍵為自動遞增的整數,如果希望資料表中的主鍵為非遞增或非數字時,可以定義public $incrementing = false;
用來關閉預設。
3. Model不支持複合主鍵(複合主鍵:有兩個key所組合成複合主鍵,白話文-兩個主鍵組成一個值,一起視為主鍵)
4. 在預設的情況下,Model會主動管理created_at以及updated_at(自動更新),如果不需要的話 可以設置public $timestamps = false;
5. 資料庫連線,在model的預設下會使用 mysql(這裡的mysql是定義的連線名稱,不是那隻海豚),如果有要連線其他資料庫,則可以在$connection
的地方設定連線名稱。連線的設定請參考 .env
以及 database
這兩個檔案來設置。
既然Model跟(關聯式)資料庫息息相關,那我們也可以在Model上設定跟其他Model之間的關係,例如:一對一、一對多、多對一、多對多。
這些不同的關係,用關聯的好處是,當我們設定好關聯,在資料庫取回來的資料可以直接使用關聯的function來取得關聯資料。
Laravel 5.1 官方範例:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
/**
* 取得撰寫該書的作者。
*/
public function author()
{
return $this->belongsTo('App\Author');
}
}
$user = App\User::find(1);
$user->posts()->where('active', 1)->get(); //這裡可以直接用posts來取得Post Model的資料
當然,關聯還有一個很棒的特性:預載入,這個功能雖然叫"預載入",但他其實是"延遲載入"的意思,使用預載入可以避免多次載入的問題
$books = App\Book::all();
foreach ($books as $book) {
echo $book->author->name;
}
在這個情況下,假設N本書,這裡會執行N + 1次查詢(第一次取all、N次的關聯查詢)
$books = App\Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
如果使用預載入,則會降低至兩次,實際上的查詢行為是:
select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)
上面有提到「我們可以將對資料庫的事情」改成在model做;那Laravel能不能寫原生的Sql語法?答案是可以的。
那為什麼要透過Model來操作資料表?基本上Model提供了很多能夠讓我們使用的功能,而這些功能都是封裝過的,因此我們可以降低重複寫程式碼的頻率
也能夠防止簡單的sql injection(我們可以寫一段code來操作Model,然後使用 ->tosql() 的方式dd出來,會發現Laravel把變數的地方都轉換成佔位符並使用參數化查詢的方式。
因此我自己在做專案開發的時候會比較傾向能用Model就用Model來操作,基本上Model的function有很,這裡列舉一些常用的:
1. where:就是基本Sql的where,使用方法:where('column',value)
2. whereIn:就是基本Sql的whereIn,使用方法 : whereIn('column' , array )
基本上就這兩個很常用,後續我們實作有用到再來補充XD
資料庫操作可以參考這裡(這裡的範例都是沒有用Model,如果有自己建立Model的話,可以將DB::table('users')
替換成User::
,其他的使用方式都是一樣的)
在Laravel 的官方文件中有提到非常多不同的function以及各種情境的使用,我這邊就精簡的列出一些後續實作上比較常會用到的東西。
因為官方文件真的很長,有興趣的同學可以參考這裡。要是我全部都寫(翻)(譯)出來大概又是三天吧XD
已經接近一半了,我們明天見!